home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / tarsrc Folder / menu.c < prev    next >
Text File  |  1993-11-27  |  6KB  |  320 lines

  1. /*
  2.  * Macintosh Tar
  3.  *
  4.  * Written by Craig Ruff.
  5.  *
  6.  * Menu handling routines.
  7.  */
  8.  
  9. #include "tar.h"
  10. #include <Resources.h>
  11.  
  12. /*
  13.  * Resource IDs for menus
  14.  */
  15. #define appleID        128
  16. #define fileID        129
  17. #define editID        130
  18. #define optionID    131
  19.  
  20. /*
  21.  * Index for each menu
  22.  */
  23. #define appleMenu    0
  24. #define fileMenu    1
  25. #define editMenu    2
  26. #define optionMenu    3
  27. #define menuCount    4
  28.  
  29. /*
  30.  * Item in Apple Menu
  31.  */
  32. #define aboutItem    1
  33.  
  34. /*
  35.  * Items in File Menu
  36.  */
  37. #define createItem    1        /* Create archive */
  38. #define extractItem    2        /* Extract archive */
  39. #define listItem    3        /* List archive */
  40. #define closeItem    5        /* Close (only for Desk Acc) */
  41. #define pgsetItem    6        /* Page setup */
  42. #define prefItem    7
  43. #define quitItem    9
  44.  
  45. /*
  46.  * Items in Edit Menu
  47.  *
  48.  * For use by Desk Accessories.
  49.  */
  50. #define undoItem    1
  51. #define cutItem        3
  52. #define copyItem    4
  53. #define pasteItem    5
  54. #define clearItem    6
  55.  
  56. /*
  57.  * Items in Options Menu
  58.  */
  59. #define convertItem    1        /* Convert newlines */
  60. #define doscvtItem    2        /* Convert DOS stype newlines */
  61. #define    oldArchItem    3        /* Old tar compatible archive creation */
  62. #define floppyItem    4        /* Use floppy as archive file */
  63. #define tapeItem    5        /* Use tape drive as archive file */
  64. #define tapeOptItem    6        /* Tape SCSI ID dialog */
  65. #define blockItem    7        /* Set block size */
  66. #define overWriteItem    8        /* Force over write of files on extract */
  67. #define pageItem    10        /* Control paging of screen listing */
  68. #define printItem    11        /* Use printer instead of screen */
  69. #define typeItem    13        /* Creator/Type dialog */
  70.  
  71. /*
  72.  * Menu related variables
  73.  */
  74.  
  75. MenuHandle    menus[menuCount];
  76. Boolean        menusOK;
  77.  
  78. /*
  79.  * MenuInit - set up menu bar
  80.  *
  81.  *    Reads non-apple menus from resource file.
  82.  */
  83. Boolean
  84. MenuInit() {
  85.     int    i;
  86.     char    *routine = "\pMenuInit";
  87.  
  88.     if ((menus[appleMenu] = GetMenu(appleID)) == nil) {
  89.         OSAlert(routine, "\pGetMenu Apple Menu", nil, ResError());
  90.         return(true);
  91.     }
  92.  
  93.     AddResMenu(menus[appleMenu], 'DRVR');
  94.     if ((menus[fileMenu] = GetMenu(fileID)) == nil) {
  95.         OSAlert(routine, "\pGetMenu File Menu", nil, ResError());
  96.         return(true);
  97.     }
  98.  
  99.     if ((menus[editMenu] = GetMenu(editID)) == nil) {
  100.         OSAlert(routine, "\pGetMenu Edit Menu", nil, ResError());
  101.         return(true);
  102.     }
  103.  
  104.     if ((menus[optionMenu] = GetMenu(optionID)) == nil) {
  105.         OSAlert(routine, "\pGetMenu Option Menu", nil, ResError());
  106.         return(true);
  107.     }
  108.  
  109.     for (i = appleMenu; i < menuCount; i++)
  110.         InsertMenu(menus[i], 0);
  111.  
  112.     DDaMenus();
  113.     /*
  114.      * Setup checkmarks from preferences.
  115.      */
  116.     if (pref.tape && pref.floppy)
  117.         pref.floppy = false;
  118.         
  119.     CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  120.     CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  121.     CheckItem(menus[optionMenu], oldArchItem, pref.oldArch);
  122.     CheckItem(menus[optionMenu], floppyItem, pref.floppy);
  123.     CheckItem(menus[optionMenu], pageItem, pref.autoPage);
  124.     CheckItem(menus[optionMenu], printItem, pref.doPrint);
  125.     CheckItem(menus[optionMenu], tapeItem, pref.tape);
  126.     DrawMenuBar();
  127.     return(false);
  128. }
  129.  
  130. /*
  131.  * MenuCmd - handle a menu pick or keyboard equivalent
  132.  */
  133. MenuCmd(result)
  134. long    result;
  135. {
  136.     WindowPeek    wp;
  137.     short        theItem = result & 0xffff;
  138.     short        theMenu = (result >> 16) & 0xffff;
  139.     char        name[256];
  140.     OSErr        err;
  141.     char        *routine = "\pMenuCmd";
  142.     GrafPtr        savedPort;
  143.  
  144.     switch (theMenu) {
  145.     case appleID:
  146.         if (theItem == aboutItem)
  147.             DoAboutBox();
  148.         else {
  149.             /*
  150.              * Oh boy, set up for a desk accessory.
  151.              */
  152.             GetItem(menus[appleMenu], theItem, name);
  153.             GetPort(&savedPort);
  154.             if ((err = ZeroScrap()) != noErr) {
  155.                 OSAlert(routine, "\pZeroScrap", nil, err);
  156.                 break;
  157.             }
  158.  
  159.             if ((err = TEToScrap()) != noErr) {
  160.                 OSAlert(routine, "\pTEToScrap", nil, err);
  161.                 break;
  162.             }
  163.  
  164.             (void) OpenDeskAcc(name);
  165.             SetPort(savedPort);
  166.             if (FrontWindow() != nil) {
  167.                 EDaMenus();
  168.             }
  169.         }
  170.         break;
  171.  
  172.     case fileID:
  173.         switch (theItem) {
  174.         case createItem:
  175.             ArCreate();
  176.             break;
  177.  
  178.         case extractItem:
  179.             Extract();
  180.             break;
  181.  
  182.         case listItem:
  183.             List();
  184.             break;
  185.  
  186.         case closeItem:
  187.             /*
  188.              * If the front window belongs to a Desk Acc, close it!
  189.              */
  190.             if ((wp = (WindowPeek) FrontWindow()) == nil)
  191.                 break;
  192.  
  193.             if (wp->windowKind < 0) {
  194.                 CloseDeskAcc(wp->windowKind);
  195.                 DDaMenus();
  196.             }
  197.             break;
  198.  
  199.         case pgsetItem:
  200.             if (!PrSetup())
  201.                 (void) PrStlDialog(prRecHdl);
  202.             break;
  203.  
  204.         case prefItem:
  205.             SavePreferences();
  206.             break;
  207.             
  208.         case quitItem:
  209.             doneFlag = true;
  210.             break;
  211.         }
  212.         break;
  213.  
  214.     case editID:
  215.         /*
  216.          * Send to a Desk Acc.
  217.          */
  218.         (void) SystemEdit(theItem - 1);
  219.         break;
  220.  
  221.     case optionID:
  222.         switch (theItem) {
  223.         case convertItem:
  224.             pref.cvtNl ^= true;
  225.             CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  226.             if (pref.cvtNl) {
  227.                 pref.dosCvt = false;
  228.                 CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  229.             }
  230.             
  231.             break;
  232.  
  233.         case doscvtItem:
  234.             pref.dosCvt ^= true;
  235.             CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  236.             if (pref.dosCvt) {
  237.                 pref.cvtNl = false;
  238.                 CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  239.             }
  240.             
  241.             break;
  242.             
  243.         case oldArchItem:
  244.             pref.oldArch ^= true;
  245.             CheckItem(menus[optionMenu], oldArchItem, pref.oldArch);
  246.             break;
  247.  
  248.         case floppyItem:
  249.             pref.floppy ^= true;
  250.             CheckItem(menus[optionMenu], floppyItem, pref.floppy);
  251.             if (pref.floppy && pref.tape) {
  252.                 pref.tape = false;
  253.                 CheckItem(menus[optionMenu], tapeItem, pref.tape);
  254.             }
  255.             break;
  256.  
  257.         case overWriteItem:
  258.             pref.doOverWrite ^= true;
  259.             CheckItem(menus[optionMenu], overWriteItem, pref.doOverWrite);
  260.             break;
  261.  
  262.         case blockItem:
  263.             DoBlockSize();
  264.             break;
  265.  
  266.         case pageItem:
  267.             pref.autoPage ^= true;
  268.             CheckItem(menus[optionMenu], pageItem, pref.autoPage);
  269.             break;
  270.  
  271.         case printItem:
  272.             pref.doPrint ^= true;
  273.             CheckItem(menus[optionMenu], printItem, pref.doPrint);
  274.             break;
  275.  
  276.         case typeItem:
  277.             DoCreatorType();
  278.             break;
  279.         
  280.         case tapeItem:
  281.             pref.tape ^= true;
  282.             CheckItem(menus[optionMenu], tapeItem, pref.tape);
  283.             if (pref.tape && pref.floppy) {
  284.                 pref.floppy = false;
  285.                 CheckItem(menus[optionMenu], floppyItem, pref.floppy);
  286.             }
  287.             break;
  288.             
  289.         case tapeOptItem:
  290.             DoTapeOptions();
  291.             break;
  292.  
  293.         }
  294.         break;
  295.     }
  296.  
  297.     HiliteMenu(0);
  298.     FlushEvents(everyEvent, 0);
  299. }
  300.  
  301. /*
  302.  * DDaMenus - disable Desk Acc specific menu and menu item
  303.  */
  304. DDaMenus() {
  305.     DisableItem(menus[editMenu], 0);
  306.     DisableItem(menus[fileMenu], closeItem);
  307.     DrawMenuBar();
  308.     menusOK = true;
  309. }
  310.  
  311. /*
  312.  * EDaMenus - enable Desk Acc specific menu and menu item
  313.  */
  314. EDaMenus() {
  315.     EnableItem(menus[editMenu], 0);
  316.     EnableItem(menus[fileMenu], closeItem);
  317.     DrawMenuBar();
  318.     menusOK = false;
  319. }
  320.